package com.nettyBasic.n4_futureAndPromise;

import io.netty.channel.EventLoop;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;

/**
 * @author： pang-yun
 * @date： 2021-09-13 11:39
 * 功能目的 ：用于 测试 netty 中的 future 接口
 * <p>
 * 此future 可以异步获取结果 addListener 由执行线程拿到结果
 * future.getNow(): 获取任务结果， 非阻塞方法  还未产生结果时 返回null
 */
@Slf4j
public class NettyFuture {
    public static void main(String[] args) {
        //1.创建nioEventLoopGroup 再从 eventLoop 中获取线程
        NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup();

        EventLoop eventLoop = eventLoopGroup.next();

        Future<Integer> future = eventLoop.submit(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                log.info("calculate beginning.........");
                Thread.sleep(1000);
                return 88;
            }
        });

        future.addListener(new GenericFutureListener<Future<? super Integer>>() {
            @Override
            public void operationComplete(Future<? super Integer> future) throws Exception {
                Integer futureNow = (Integer) future.getNow();  // 获取任务结果， 非阻塞方法  还未产生结果时 返回null
                log.info("result: {}", futureNow);
            }
        });

    }
}
